// 纯函数： 相同的输入永远得到相同的输出，而且没有任何可观察的副作用
// slice 返回数组中的指定部分，不会改变原数组 （纯函数），
// splice 对数组进行操作返回该数组，会改变原数组 （不纯函数）

const _ = require('lodash')

// 纯函数
function getSum(num1, num2) {
    return num1 + num2
}

// 函数式编程不会保留计算中间的结果，所以变量是不可变的（无状态的）
// 我们可以把一个函数的执行结果交给另一个函数去处理

// 优点
// 1.可缓存
    // 因为纯函数相同的输入始终有相同的结果，所以可以把纯函数的结果缓存起来
   
// 2.可测试，纯函数让测试更方便
// 3.并行处理
    

// 记忆函数
function getArea(r) {
    console.log(r)
    return Math.PI * r * r
}

// let getAreaWithMemory = _.memoize(getArea)
// console.log(getAreaWithMemory(4));
// console.log(getAreaWithMemory(4));
// console.log(getAreaWithMemory(4));
// console.log(getAreaWithMemory(4));
// console.log(getAreaWithMemory(4));
// console.log(getAreaWithMemory(4));


// 模拟 memoize 方法的实现
function memoize (fn) {
    let cache = {}
    return function() {
        let key = JSON.stringify(arguments);
        cache[key] = cache[key] || fn.apply(fn, arguments);
        return cache[key];
    }
}

let getAreaWithMemory = memoize(getArea)
console.log(getAreaWithMemory(4));
console.log(getAreaWithMemory(4));
console.log(getAreaWithMemory(4));
console.log(getAreaWithMemory(4));
console.log(getAreaWithMemory(4));
console.log(getAreaWithMemory(4));